<?
/*########################## 1. 오류 처리 관련 ###############################*/
define('ERR_NULL',		0);
define('ERR_DEFAULT',	1);
define('MODULE_REQUIRE', 2);
define('PAGE_ERR_MAX',	2000);
define('SYS_ERR_MAX',	1000);

function raise_error($errorCode = ERR_DEFAULT)
{
	if (function_exists('handle_error'))
		handle_error($errorCode);
	else
		DefaultHandleError($errorCode);
}


/*########################## 2. 변수 조회 관련 ###############################*/

define('SESS_SAVE_SESSION',	0);
define('SESS_SAVE_COOKIE',	1);

class Variables
{
	// abstract any get(String name [, any defaultValue [, int errorCode ] ]);
	function get($name, $defaultValue = null, $errorCode = ERR_NULL)
	{
		return null;
	}

	// String getString(String name [, String defaultValue [, int errorCode] ]);
	function getString($name, $defaultValue = "", $errorCode = ERR_NULL)
	{
		$value =& $this->get($name, $defaultValue, $errorCode);
		if ($value == "" && $errorCode != ERR_NULL)
			raise_error($errorCode);
		else
			return $value;
	}

	// int getNumber(String name [, int defaultValue [, int errorCode ] ]);
	function getNumber($name, $defaultValue = 0, $errorCode = ERR_NULL)
	{
		$value =& $this->get($name, $defaultValue, $errorCode);
		if ($value == "" && $errorCode != ERR_NULL)
			raise_error($errorCode);
		else
			return $this->toInt($value);
	}

	// boolean getBoolean(String name [, boolean defaultValue [, int errorCode ] ]);
	function getBoolean($name, $defaultValue = false, $errorCode = ERR_NULL)
	{
		$value =& $this->get($name, $defaultValue, $errorCode);
		return $this->toBoolean($value);
	}

	function toInt($value)
	{
		return $value + 0;
	}

	function toBoolean($value)
	{
		if (strtolower($value) == "n")
			return false;
		elseif (strtolower($value) == "no")
			return false;
		elseif (strtolower($value) == "false")
			return false;
		elseif (strtolower($value) == "null")
			return false;
		elseif (strtolower($value) == "undefined")
			return false;
		elseif (strtolower($value) == "아니오")
			return false;
		else
			return (bool)$value;
	}
}

if (!$DISABLE_SESSION)
{
	$session = new Sessions();
}

class Sessions
	extends Variables
{
	function Sessions()
	{
		@session_start();
	}

	// any get(String name [, any defaultValue [, int errorCode ] ]);
	function &get($name, $defaultValue = null, $errorCode = ERR_NULL)
	{
		if (isset($_SESSION[$name]))
			return $_SESSION[$name];
		elseif (isset($_COOKIE[$name]))
			return $_COOKIE[$name];
		elseif ($errorCode == ERR_NULL)
			return $defaultValue;
		else
			raise_error($errorCode);
	}

	// void set(String name, any value [, int saveMethod ] );
	function set($name, &$value, $method = SESS_SAVE_SESSION, $options = null)
	{
		if ($method == SESS_SAVE_COOKIE)
			$this->set_Cookie($name, $value, $options);
		else
			$this->set_Session($name, $value, $options);
	}

	// void remove(String name [, int saveMethod ] );
	function remove($name, $method = SESS_SAVE_SESSION, $options = null)
	{
		if ($method == SESS_SAVE_COOKIE)
			$this->unset_Cookie($name, $options);
		else
			$this->unset_Session($name, $options);
	}

	function set_Cookie($name, &$value, $options = null)
	{
		// 헤더가 출력된 후면 포기한다.
		if (!headers_sent())
		{
			if ($options['expire'])	$expire = $options['expire'];
			else					$expire = null;

			if ($options['path'])	$path = $options['path'];
			else					$path = null;

			if ($options['domain'])	$domain = $options['domain'];
			else					$domain = null;

			if ($options['secure'])	$expire = $options['secure'];
			else					$secure = null;

			setCookie($name, $value, $expire, $path, $domain, $secure);
		}
	}

	// private void unset_Cookie(String name);
	function unset_Cookie($name, $options = null)
	{
		// 헤더가 출력된 후면 포기한다.
		if (!headers_sent())
		{
			if ($options['expire'])	$expire = $options['expire'];
			else					$expire = null;

			if ($options['path'])	$path = $options['path'];
			else					$path = null;

			if ($options['domain'])	$domain = $options['domain'];
			else					$domain = null;

			if ($options['secure'])	$expire = $options['secure'];
			else					$secure = null;

			setCookie($name, "", $expire, $path, $domain, $secure);
		}
	}

	// private void set_Session(String name, any value);
	function set_Session($name, &$value, $options = null)
	{
		// (PHP 4.1.0) register_globals 의 값에 따라
		// 다르게 수행해야 한다.
		if (ini_get("register_globals"))
		{
			// 기존 방식
			if (!session_is_registered($name))
				session_register($name);
			$GLOBALS[$name];
		}
		else
		{
			// 새로운 방식
			$_SESSION[$name] = $value;
		}
	}

	// private void unset_Session(String name);
	function unset_Session($name, $options = null)
	{
		// (PHP 4.1.0) register_globals 의 값에 따라
		// 다르게 수행해야 한다.
		if (ini_get("register_globals"))
		{
			// 기존 방식
			if (session_is_registered($name))
				session_unregister($name);
			unset($GLOBALS[$name]);
		}
		else
		{
			// 새로운 방식
			unset($_SESSION[$name]);
		}
	}
}

$param = new Parameters();
class Parameters
	extends Variables
{
	var $sapi;
	function Parameters()
	{
		$this->sapi = php_sapi_name();
		if ($this->sapi == 'cli')
			$this->parseArgv();
	}

	function parseArgv()
	{
		global $_PARSED_ARGV;
		if (!is_array($_PARSED_ARGV))
			$_PARSED_ARGV = array();

		for ($i = 1; $i < $_SERVER['argc']; $i++)
		{
			parse_str($_SERVER['argv'][$i], $tmp_arr);
			$_PARSED_ARGV = array_merge($_PARSED_ARGV, $tmp_arr);
		}
	}

	// any get(String name [, any defaultValue [, int errorCode ] ]);
	function &get($name, $defaultValue = null, $errorCode = ERR_NULL)
	{
		global $_PARSED_ARGV;
		if ($this->sapi == 'cli' && isset($_PARSED_ARGV[$name]))
			return $_PARSED_ARGV[$name];
		elseif (strtoupper($_SERVER['REQUEST_METHOD']) == "POST" && isset($_POST[$name]))
			return $_POST[$name];
		elseif (isset($_GET[$name]))
			return $_GET[$name];
		elseif ($errorCode == ERR_NULL)
			return $defaultValue;
		else
			raise_error($errorCode);
	}

	// Array getFile(String name [, any defaultValue [, int errorCode ] ]);
	function &getFile($name, $defaultValue = null, $errorCode = ERR_NULL)
	{
		if (isset($_FILES[$name]))
		{
			$arr =& $_FILES[$name];
			if (is_array($arr) && $arr['error'] != 4)
				return $arr;
			else
				return $defaultValue;
		}
		elseif ($errorCode == ERR_NULL)
			return $defaultValue;
		else
			raise_error($errorCode);
	}
}

function encodeParamArray(&$array)
{
	if (!is_array($array))
		return "";
	$keys = array_keys($array);
	$params = array();
	foreach ($keys as $key)
	{
		//if (isset($array[$key]) && $array[$key] != "")
			array_push($params, "$key=" . urlencode($array[$key]));
	}
	return join('&', $params);
}

function makeWhereQry(&$array)
{
	if (!is_array($array))
		return "";
	$fields = array_keys($array);
	$wherecondition = array();
	foreach ($fields as $field)
	{
		if (isset($array[$field]) && $array[$field] != "") {
			$condition = mysql_real_escape_string(stripslashes($array[$field]));
			array_push($wherecondition, "$field='" . $condition . "'" );
		}
	}
	return join(' and ', $wherecondition);
}


/*########################## 3. 로그인 확인 관련 #############################*/
function RequireMemberAuth($options = null)
{
	/*권한 체크
	if ($PHP_SELF =='admin????.php' && $member_level != 2)
	{
		return;
	}
	*/

	global $session, $LOGIN_FORM_URL;

	if ($options['login_form'])
		$login_form = $options['login_form'];
	else if ($LOGIN_FORM_URL)
		$login_form = $LOGIN_FORM_URL;
	else
		$login_form = "/mem/login.html";

	// 로그인이 되었으므로 그냥 리턴
	if ( GetCurrentUser($options) )
	{
		// POST 로 요청받은 페이지에서 로그인 페이지로 리다이렉트 한 경우
		// 로그인 성공 후 되돌아 올 때는 GET 방식으로 돌아오게 된다.
		// 따라서 세션에 저장했던 $_POST 데이터를 $_GET에 추가한다.
		if (isset($_GET['postkey']) && $_GET['postkey'] != "")
		{
			$postdata = $session->getString($_GET['postkey']);
			if ($postdata != "")
			{
				$postarr = unserialize($postdata);
				foreach ($postarr as $key => $value)
				{
					$_GET[$key] = $value;
				}
			}
			$session->remove($_GET['postkey']);
		}
		return;
	}

	// 로그인이 안된 상태이므로 로그인페이지로 이동한다.
	if ($options['full_return_url'])
	{
		if (preg_match('!^https/!i', $_SERVER['SERVER_PROTOCOL']))
			$return_url = "https://";
		else
			$return_url = "http://";
		$return_url .= $_SERVER['SERVER_NAME'];
		if ($_SERVER['SERVER_PORT'] != 80)
			$return_url .= ":" . $_SERVER['SERVER_PORT'];
		$return_url .= $_SERVER['REQUEST_URI'];
	}
	else
	{
		$return_url = $_SERVER["REQUEST_URI"];
	}

	if (strtoupper($_SERVER["REQUEST_METHOD"]) == "POST")
	{
		// POST 메쏘드일 경우 폼 데이터를 serialize()하여 세션에 저장하고
		// 로그인을 마친 이후에 다리 복원하도록 한다.
		// 업로드된 파일은 세션에 저장할 수 없다.
		//$postkey = GeneratePostkey();
		$postkey = 'post_' . time();
		$session->set($postkey, serialize($_POST), SESS_SAVE_SESSION);
		$return_url = addParameter($return_url, "postkey=$postkey");
	}
	$login_url = addParameter($login_form, "return_url=" . urlencode($return_url));
	httpRedirect($login_url, true);
}


/*########################## 4. 기타 유틸리티 함수 ###########################*/
define('CACHE_POLICY_NOCACHE', 0);
define('CACHE_POLICY_PRIVATE', 1);
define('CACHE_POLICY_PUBLIC', 2);


// void cacheControl( [ int policy ] );
function cacheControl($policy = 1)
{
	if (headers_sent())	// 헤더가 이미 보내졌다면 그냥 포기한다.
		return;

	switch ($policy)
	{
	case CACHE_POLICY_NOCACHE:	// 0
		Header("Expires: 0");	// for HTTP/1.0 browsers
		Header("Pragma: no-cache");
		Header("Cache-Control: no-cache");
		break;
	case CACHE_POLICY_PUBLIC:	// 2
		Header("Cache-Control: public");
		break;
	case CACHE_POLICY_PRIVATE:	// 1
	default:
		Header("Cache-Control: private");
	}
}

// void httpRedirect( String redirect_url [, boolean parmanet ] );
function httpRedirect($redirect_url, $permanent = false)
{
	if (headers_sent())	// 헤더가 이미 보내졌다면 그냥 포기한다.
		return;

	// 출력 버퍼를 비운다.
	ob_clean();

	if ($permanent)
	{
		Header("HTTP/1.1 301 Moved");
		cacheControl(1);
	}
	else
	{
		Header("HTTP/1.1 302 Found");
		cacheControl(0);
	}
	Header("Location: $redirect_url");
	exit;
}

// void httpError( int status, String messge, String comment );
function httpError($status, $message = null, $comment = null)
{
	if (!headers_sent())	// 헤더가 이미 보내졌다면 그냥 포기한다.
	{
		cacheControl(0);
		Header("HTTP/1.1 $status $message");
	}

	// 출력 버퍼를 비운다.
	ob_clean();

	$error_file = $_SERVER['DOCUMENT_ROOT'] . "/errors/_404.php";
	if (file_exists($error_file))
		include $error_file;
	else
	{
		if ($message)
			$error_title = "$status $message";
		else
			$error_title = "HTTP Error $status";
?>
<html>
<head>
<title><?= $error_title ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
</head>
<body>
	<h3><?= $error_title ?></h3>
	<p><?= ($comment)? $comment: "" ?></p>
</body>
</html>
<?
	}
	exit;
}

function errMsg($msg, $encoding = true)
{
	cacheControl(0);
	// 출력 버퍼를 비운다.
	ob_clean();

	$replacement = array(
		"\"" => '\\"',
		"\'" => "\\'",
		"\n" => "\\n",
		"\r" => "\\r"
	);
	$msg = preg_replace('/(\n|\r|"|\')/e', '$replacement["\\1"]', $msg);
	
	if ( $encoding != null ) {
		$msg = iconv("UTF-8", "EUC-KR", $msg);
	}
	
?>
<script language="javascript">
	alert('<? echo $msg ?>');
	history.back();
</script>
<?
}

// void jserror( String message [, String action [, boolean do_exit ] ] );
function jserror($msg, $action = 'history.back()', $do_exit = true, $encoding = false)
{
	cacheControl(0);
	// 출력 버퍼를 비운다.
	ob_clean();

	$replacement = array(
		"\"" => '\\"',
		"\'" => "\\'",
		"\n" => "\\n",
		"\r" => "\\r"
	);
	$msg = preg_replace('/(\n|\r|"|\')/e', '$replacement["\\1"]', $msg);
	
	if ( $encoding != null ) {
		$msg = iconv("UTF-8", "EUC-KR", $msg);
	}
	
?><script language="javascript">
	alert('<? echo $msg ?>');
	<? if ($action != '') echo $action . ";\n"; ?>
</script>
<?
	if ($do_exit) exit;
}

function jserrorPop($msg, $refresh = false, $encoding = false)
{
	cacheControl(0);
	// 출력 버퍼를 비운다.
	ob_clean();

	$replacement = array(
		"\"" => '\\"',
		"\'" => "\\'",
		"\n" => "\\n",
		"\r" => "\\r"
	);
	$msg = preg_replace('/(\n|\r|"|\')/e', '$replacement["\\1"]', $msg);

	if ( $encoding != null ) {
		$msg = iconv("UTF-8", "EUC-KR", $msg);
	}

?><script language="javascript">
	alert('<? echo $msg ?>');
	<? 
	if ( $refresh ) echo "opener.location.reload();";
	?>
	window.close();
</script>
<?
}


function jsMsg($msg, $action = 'history.back()',$encoding = false) {
	if ($action != '') 
		$action = "location.replace('$action');";
	jserror($msg, $action, false, $encoding);
}



// String encodeParameter( String name0, any value0 [, String name1, any value1, ... ] );
function encodeParameter()
{
	$arr = array();
	$len = func_num_args();
	for ($i = 0; $i < $len; $i += 2)
	{
		$name = func_get_arg($i);
		$value = func_get_arg($i + 1);
		array_push($arr, $name . "=" . urlencode($value));
	}
	return join("&", $arr);
}

// String addParameter( String url, String parameters );
function addParameter($url, $parameters)
{
	if (strstr($url, "?"))
		$url .= "&" . $parameters;
	else
		$url .= "?" . $parameters;
	return $url;
}

// cutString( String, length, tails );
function cutString($str, $len, $dot)
{
	if(strlen($str)>$len)
	{
		for($i=0; $i<$len; $i++)
		{
			if(ord($str[$i])>127)
				$i++;
		}

		$str=substr($str,0,$i);
		$str .= $dot;
	}
	return $str;
}

// hangul_cut( $str, $max_length, $cut_length, $suffix);
function hangul_cut($str, $max_length, $cut_length = -1, $suffix = "...")
{
	if ($cut_length == -1)
		$cut_length = $max_length - strlen($suffix);

	if (strlen($str) > $max_length)
	{
		for($i = 0; $i < $cut_length; $i++)
		{
			if ( ord($str[$i]) > 127 )
				$i++;
		}
		$str = substr($str, 0, $i);
		$str .= $suffix;
	}
	return $str;
}

//DB에서 읽어 올때
function nohtml($str)
{
	$str=str_replace("<", "&lt;", $str);
	$str=str_replace("'", "&#039;", $str);
	$str=str_replace("\"", "&quot;", $str);
	return $str;
}

function noSqlInjection($value)
{
	return noSqlInjectionForDBInsUpd($value);
}


function noHtmlForDBSelect($value)
{
	$value = nohtml($value); 
	return $value;
}

//DB에서 select후  input vlue 에 사용시 필드값을 감싼다.
function _noHtmlArray($var) { 
	if(!is_array($var)) return noHtmlForDBSelect($var); 
	$var = array_map('noHtmlForDBSelect',$var); 
	return $var; 
}	


function noSqlInjectionForDBInsUpd($value)
{
	$value = mysql_real_escape_string($value);
	return $value;
}

//Add \ where DB Insert, Update 
function _noInjection($var) { 
	if(!is_array($var)) return noSqlInjectionForDBInsUpd($var); 
	$var = array_map('noSqlInjectionForDBInsUpd',$var); 
	return $var; 
}

//엑셀로 출력시 mysql, excel 함수를 이용하여 숫자를 텍스트형식으로 바꾼다.
function RtnExcelText($value, $name){
	return "	CONCAT('=T(\"',$value,'\")')	as '$name', ";
}
?>